package org.study.mq.kafka.java;

import org.apache.kafka.clients.producer.*;

import java.util.HashMap;
import java.util.Map;

public class ProducerSample {

    public static void main(String[] args) {
        Map<String, Object> props = new HashMap<>();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        //acks 参数控制生产者在消息写入成功后等待多少副本确认（ACK）
        //生产者确认:
        //Kafka 的写操作是异步的，但为了确保数据的可靠性，生产者需要得到一个确认（ACK）。
        // 如果生产者的写入请求要求保证至少 N 个副本（通常是 N=2 或 3）同步成功，那么 Kafka 会等待 ISR 中的副本数 满足该要求。
        // 如果 ISR 中的副本数足够，生产者就会收到写入成功的确认。
//        props.put(ProducerConfig.ACKS_CONFIG,"0");//生产者不等待任何副本的确认。  最高效
        props.put(ProducerConfig.ACKS_CONFIG,"1");//生产者等待 Leader 副本确认消息写入。   有一定的容错性
//        props.put(ProducerConfig.ACKS_CONFIG,"all");//生产者等待 ISR 中所有副本确认写入。   性能最低


        String topic = "test-topic";
        Producer<String, String> producer = new KafkaProducer<String, String>(props);
        producer.send(new ProducerRecord(topic, "idea-key2", "java-message 1"));
        producer.send(new ProducerRecord(topic, "idea-key2", "java-message 2"));
        producer.send(new ProducerRecord(topic, "idea-key2", "java-message 3"));

        producer.close();
    }

}
